/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ch.fhnw.swa.aufgabenverwaltungswa.controller;

import ch.fhnw.swa.aufgabenverwaltungswa.business.AufgabenbearbeitungEJB;
import ch.fhnw.swa.aufgabenverwaltungswa.persistenz.Aufgabe;
import ch.fhnw.swa.aufgabenverwaltungswa.persistenz.Aufgabe.Prioritaet;
import ch.fhnw.swa.aufgabenverwaltungswa.persistenz.Aufgabe.Status;
import ch.fhnw.swa.aufgabenverwaltungswa.persistenz.Mitarbeiter;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

/**
 * Diese Klasse ist der Controller für die Aufgabenverwaltung.
 * Sie verwaltet die Aktionen und Eingaben von Aufgaben.
 * @author Tobias Neuenschwander
 * @author Benjamin Schatzmann
 * @author Edis Dilji
 * @author Francis Murillo
 */
@ManagedBean
@SessionScoped //SessionScope um die Möglichkeit zu haben eine Entity in einem Fenster auszuwählen und zwischenzuspeichern
               //um es in einem anderen Fenster wieder anzuzeigen
public class AufgabenController {
    //**************************************************************************
    //Variablen
    //**************************************************************************
    @EJB
    private AufgabenbearbeitungEJB aufgabenbearbeitungEJB;  //Sessionbean für Aufgaben
    private Aufgabe aufgabe = new Aufgabe();    //Aufgabe, welche vom Benutzer gesehen, editiert oder erstellt wird
    private List<Aufgabe> aufgabenListe;        //Liste aller Aufgaben, wird z.B. bei showEmployee angezeigt
    private ArrayList<String> maList;           //Id's aller Mitarbeiter als String, welche einer Aufgabe zugeteilt sind
    
    //**************************************************************************
    //Getter/Setter
    //**************************************************************************
    public AufgabenbearbeitungEJB getAufgabenbearbeitungEJB() {
        return aufgabenbearbeitungEJB;
    }

    public void setAufgabenbearbeitungEJB(AufgabenbearbeitungEJB aufgabenbearbeitungEJB) {
        this.aufgabenbearbeitungEJB = aufgabenbearbeitungEJB;
    }

    public Aufgabe getAufgabe() {
        return aufgabe;
    }

    public void setAufgabe(Aufgabe aufgabe) {
        this.aufgabe = aufgabe;
    }

    public List<Aufgabe> getAufgabenListe() {
        return aufgabenListe;
    }

    public void setAufgabenListe(List<Aufgabe> aufgabenListe) {
        this.aufgabenListe = aufgabenListe;
    }

    public ArrayList<String> getMaList() {
        return maList;
    }

    public void setMaList(ArrayList<String> maList) {
        this.maList = maList;
    }
    
    //**************************************************************************
    //Methoden
    //**************************************************************************
    /**
     * Diese Methode ruft das Aufgabenfenster (askTask.xhtml) auf und fuellt die Felder
     * mit den Daten der uebergebenen Aufgabenid
     * @param taskIdEdit ID der zu editierenden Aufgabe
     * @return String mit dem case fuer die faces-config (askTask.xhtml)
     */
    public String doEditTask(Long taskIdEdit){
        //Aufgabe hohlen
        aufgabe = aufgabenbearbeitungEJB.findTaskById(taskIdEdit);
        //Liste der Id's aller zugeteilter Mitarbeiter fuellen
        fillMaList();
        aufgabenListe = null;
        return ("caseAskTask");
    }
    
    /**
     * Diese Methode gibt den Auftrag die Aufgabe, deren ID uebergeben wurde, zu loeschen
     * und ladet die Liste aller Aufgaben neu.
     * @param taskIdDel ID der zu loeschende Aufgabe
     */
    public void doDeleteTask(Long taskIdDel){
        //Aufgabe loeschen
        aufgabenbearbeitungEJB.deleteTask(taskIdDel);
        //Liste aller Aufgaben neu laden
        doLoadTaskList();
    }
    
    /**
     * Diese Methode gibt den Auftrag, eine Aufgabe zu speichern und ruft
     * danach die Seite auf, wo alle Aufgaben aufgelistet werden (showTask.xhtml).
     * @return String mit dem case fuer die faces-config (showTask.xhtml)
     */
    public String doSaveTask(){
        //Aufgabe speichern
        aufgabenbearbeitungEJB.saveTask(aufgabe, maList);
        //Anzuzeigende Daten zuruecksetzten
        aufgabe=null;
        maList=null;
        return(changeShowTask());
    }
    
    /**
     * Diese Methode hohlt alle Aufgaben und ruft die Seite auf,
     * wo alle Aufgaben aufgeleistet werden (showTask.xhtml)
     * @return String mit dem case fuer die faces-config (showTask.xhtml)
     */
    public String changeShowTask(){
        //Alle Aufgaben laden
        doLoadTaskList();
        return ("caseShowTask");
    }
    
    /**
     * Diese Methode erstellt einen neue Aufgabe und zeigt die Seite an, wo
     * die Aufgabe erfasst werden kann.
     * @return String mit dem case fuer die faces-config (askTask.xhtml)
     */
    public String changeAskTask(){
        aufgabe = new Aufgabe();
        fillMaList();
        return ("caseAskTask");
    }
    
    /**
     * Diese Methode hohlt alle Aufgaben und speichert sie in der Variable aufgabenListe
     */
    public void doLoadTaskList(){
        aufgabenListe = aufgabenbearbeitungEJB.loadTaskList();
    }
    
    /**
     * Diese Methode speichert die ID's aller der aktuell bearbeiteten Aufgabe zugetilten Mitarbeiter in die maList.
     * Die ID's werden als String abgespeichert. Die Liste wird verwendet, da die Values der aus ausgewaehlten mitarbeiter
     * vom UI als String verwaltet werden.
     */
    private void fillMaList(){
        //neue Liste erstellen
        maList = new ArrayList<String>();
        //Falls eine Aufgaben- und eine Mitarbeiterzuteilungsvariable existiert,
        //ID's der der aktuellen Aufgabe zugeteilten Mitarbeiter in der maList speichern
        if (aufgabe != null && aufgabe.getMitarbeiterZugeteilt() != null){
            for (Mitarbeiter m : aufgabe.getMitarbeiterZugeteilt()){
               maList.add(m.getId().toString());
            }
        }
    }
    
    /**
     * Diese Methode hohlt alle Mitarbeiter und erstellt daraus einen Array aus SelectItems fuer das UI
     * Der Value entspricht der Mitarbeiterid und das anzuzeigende Label dem Vor- und Nachnamen.
     * @return Array von SelectItems
     */
    public SelectItem[] getMitarbeiterItems(){
        //Alle Mitarbeiter hohlen
        List<Mitarbeiter> maList = aufgabenbearbeitungEJB.getEmployeeList();
        
        //Array von SelectItems erstellen. Der Value entspricht der Mitarbeiterid
        //und das Label dem Vor- und Nachnamen
        SelectItem[] reArr = new SelectItem[maList.size()];
        for(int i = 0; i < reArr.length; i++){
            String maLabel = maList.get(i).getVorname() + " " + maList.get(i).getNachname();
            reArr[i] = new SelectItem(maList.get(i).getId(), maLabel);
        }
        return(reArr);
    }
    
    /**
     * Diese Methode erstellt aus dem Enum Status eine Array von SelectItems
     * Der Value entspricht dem Status und das anzuzeigende Label dem zugeteilten String eines Status.
     * @return Array von SelectItems
     */
    public SelectItem[] getStatusItems(){
        SelectItem[] reArr = new SelectItem[Status.values().length];
        for(int i = 0; i < reArr.length; i++){
            reArr[i] = new SelectItem(Status.values()[i], Status.values()[i].getStringOfStatus());
        }
        return(reArr);
    }
    
    /**
     * Diese Methode erstellt aus dem Enum Prioritaet eine Array von SelectItems
     * Der Value entspricht der Prioritaet und das anzuzeigende Label dem zugeteilten String einer Prioritaet.
     * @return Array von SelectItems
     */
    public SelectItem[] getPrioritaetItems(){
        SelectItem[] reArr = new SelectItem[Prioritaet.values().length];
        for(int i = 0; i < reArr.length; i++){
            reArr[i] = new SelectItem(Prioritaet.values()[i], Prioritaet.values()[i].getStringOfStatus());
        }
        return(reArr);
    }
}
